#lang racket

;; a Lock is a [Any -> [Or #t BindingList (list 'exception: exn:fail? 'binding-list: BindingList)]
;; it represents access control
;; a #t responce means that access is granted
;; else access is denied
;; the BindingList returned on failure is all the visible used bindings in the Lock
;;     and all constants used, associated with 'const
;; the exn:fail? is an error thrown by the Lock when it attempts to Evaluate with its argument

;; A BindingList is [Listof [Or (list symbol any) (cons [Or 'let 'let* 'letrec] BindingList])

;; An Expr is one of:
;; - Atom
;; - '(Expr ...)